package cn.kgc.springboot.mp.controller;

import cn.kgc.springboot.mp.entity.User;
import cn.kgc.springboot.mp.service.UserService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 课工场
 * @date 2024/11/30
 * @description
 */
@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;


    /*
    * MyBatis-Plus 的分页插件 PaginationInnerInterceptor
    *  提供了强大的分页功能，支持多种数据库，使得分页查询变得简单高效
    * */

    @GetMapping("page")
    public Map<String,Object> userPage(Integer page, Integer limit){

        Page<User> userPage = new Page<>(page, limit);
        userService.page(userPage);

        // 获取数据总条数
        long total = userPage.getTotal();
        // 获取当前页数据
        List<User> records = userPage.getRecords();

        HashMap<String, Object> result = new HashMap<>();
        result.put("total",total);
        result.put("tableData",records);
        return  result;

    }


    @GetMapping("list")
    public List<User> userList(){
        return userService.list();
    }

    /*
    *  在添加数据时 如何实现数据的自动填充
    *  1. @TableField(fill = FieldFill.UPDATE)
    *  2.自动填充功能通过实现 MetaObjectHandler 接口来实现。
    *   你需要创建一个类来实现这个接口，并在其中定义插入和更新时的填充逻辑
    * */


    @PostMapping("add")
    public Boolean addUser(User user){
        return userService.save(user);
    }

    /*
    *   乐观锁字段 version的使用
    *   乐观锁是一种并发控制机制，用于确保在更新记录时，该记录未被其他事务修改。
    *   MyBatis-Plus 提供了 OptimisticLockerInnerInterceptor 插件，使得在应用中实现乐观锁变得简单
    *
    *   乐观锁的实现通常包括以下步骤：
            1. 读取记录时，获取当前的版本号（version）。
            2. 在更新记录时，将这个版本号一同传递。
            3.执行更新操作时，设置 version = newVersion 的条件为 version = oldVersion。
            4.如果版本号不匹配，则更新失败
    * */


    @PutMapping("edit")
    public Boolean editUser(User user){
        return userService.updateById(user);
    }



    /*
    *   删除数据时 如何实现数据的逻辑删除   is_delete
    *   MyBatis-Plus 的逻辑删除功能会在执行数据库操作时自动处理逻辑删除字段。以下是它的工作方式：
        插入：逻辑删除字段的值不受限制。
        查找：自动添加条件，过滤掉标记为已删除的记录。
        更新：防止更新已删除的记录。
        删除：将删除操作转换为更新操作，标记记录为已删除
    * */


    @DeleteMapping("delete")
    public Boolean deleteUser(Integer id){
        return userService.removeById(id);
    }


}
